/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package BaseDatos;

import BaseDatos.GeneradorMySQL.EmpleadosMySQL;
import Controladores.GestorMensajes;
import Modelo.Empleado;
import com.mysql.jdbc.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author Administrador
 */
public class GestorEmpleadosBD {

////////////////////////////////////////////////////////////////////////////////
// Constructores
////////////////////////////////////////////////////////////////////////////////
    
    /**
     * constructor por defecto de la clase
     */
    public GestorEmpleadosBD(){
        iniciarComponentes();
    }

////////////////////////////////////////////////////////////////////////////////
// Interfaz de la clase
////////////////////////////////////////////////////////////////////////////////

    /**
     * crea el registro del empleado en la base de datos
     * @param _empleado 
     */
    public void registrar(Empleado _empleado){
        iniciarConexionBD();
        EmpleadosMySQL empleadosMySQL = new EmpleadosMySQL();
        String instruccionMySQL = empleadosMySQL.Registro(_empleado);
        registrarEmpleadoBD(instruccionMySQL);
    }
    
    /**
     * busca a los empleados que coincidan con la clavo o el nombre
     * @param _claveNombre
     * @return devuelve la lista de los empleados encontrados
     */
    public ArrayList<Empleado> busquedaGeneral(String _claveNombre){
        iniciarConexionBD();
        return buscarEmpleadosBD(_claveNombre);
    }
    
    /**
     * busca el empleado que coincida con la clave ingresada
     * @param _clave
     * @return devuelve el empleado encontrado
     */
    public Empleado buscarEmpleadoClave(String _clave){
        iniciarConexionBD();
        EmpleadosMySQL constructorInstruccionesMySQL = new EmpleadosMySQL();
        String instruccionMySQL = constructorInstruccionesMySQL.consultaEmpleadoClave(_clave);
        return buscarEmpleadoBD(instruccionMySQL);
    }
    
    /**
     * busca el empleado que coincida con el nombre ingresado
     * @param _nombreCompleto
     * @return devuelve el empleado encontrado
     */
    public Empleado buscarEmpleadoNombre(ArrayList<String> _nombreCompleto){
        iniciarConexionBD();
        EmpleadosMySQL constructorInstruccionesMySQL = new EmpleadosMySQL();
        String instruccionMySQL = constructorInstruccionesMySQL.consultarEmpleadoNombre(_nombreCompleto);
        return buscarEmpleadoBD(instruccionMySQL);
    }
    
////////////////////////////////////////////////////////////////////////////////
// Metodos privados
////////////////////////////////////////////////////////////////////////////////

    /**
     * realiza la busqueda de los empleados en la base de datos
     * @param _claveNombre
     * @return Devuelve la lista de los empleados encontrados
     */
    private ArrayList<Empleado> buscarEmpleadosBD(String _claveNombre){
        ArrayList<Empleado> empleadosEncontrados = new ArrayList<>();
        EmpleadosMySQL constructorInstruccionesMySQL = new EmpleadosMySQL();
        String instruccionMySQL = constructorInstruccionesMySQL.consultaGeneral(_claveNombre);
        
        try {
            ResultSet resultadoDeConsulta;
            resultadoDeConsulta = administradorSentencias.executeQuery(instruccionMySQL);
            
            while(resultadoDeConsulta.next()){
                Empleado empleado = construirEmpleado(resultadoDeConsulta);
                empleadosEncontrados.add(empleado);
            }
        } catch (SQLException log) {
            GestorMensajes administradorMensajes = new GestorMensajes();
            administradorMensajes.mensajeError(log, "empleado");
        }finally{
            terminarConexionBD();
        }
        return empleadosEncontrados;
    }
    
    /**
     * busca al empleado que coincida con la clave o nombre ingresado ingrasada
     * @param _isntruccionBusqueda
     * @return devuelve el empleado encontrado
     */
    private Empleado buscarEmpleadoBD(String _isntruccionBusqueda){
        Empleado empleado = null;
        try {
            ResultSet resultadoDeConsulta;
            resultadoDeConsulta = administradorSentencias.executeQuery(_isntruccionBusqueda);
            while(resultadoDeConsulta.next()){
                empleado = construirEmpleado(resultadoDeConsulta);
            }
        } catch (SQLException log) {
            GestorMensajes administradorMensajes = new GestorMensajes();
            administradorMensajes.mensajeError(log, "empleado");
        }finally{
            terminarConexionBD();
        }
        return empleado;
    }
    
    /**
     * construye al empleado apartir del resultado de la consulta
     * @param _resultadoBusqueda
     * @return devuelve el empleado encontrado
     */
    private Empleado construirEmpleado(ResultSet _resultadoBusqueda){
        Empleado empleado  = new Empleado();
        try {
            
            String nombre = _resultadoBusqueda.getString("Nombre");
            empleado.establecerNombre(nombre);
            
            String clave = _resultadoBusqueda.getString("Clave");
            empleado.establecerClaveEmpleado(clave);
            
            String tipoEmpleado = _resultadoBusqueda.getString("ActividadLaboral");
            empleado.establecerTipoEmpleado(tipoEmpleado);
            
        } catch (SQLException ex) {
            empleado = null;
        }
        
        return empleado;
    }
    
    /**
     * inicialisa los componentes y las variables de la clase
     */
    private void iniciarComponentes(){
        administradorSentencias = null;
    }

    /**
     * ejecuta la instruccion de registro de la base de datos
     * @param _instruccionMySQL
     * @throws SQLException 
     */
    private void registrarEmpleadoBD(String _instruccionMySQL){
        try {
            administradorSentencias.executeUpdate(_instruccionMySQL);
            imprimirExitoSentenciaMySQL("Alta de empleado Exitosa");
        } catch (SQLException | NullPointerException log){
            System.out.println(log);
        } finally{
            terminarConexionBD();
        }
    }

    /**
     * Imprime si al ejecucion de la sentencia MySQL fue exitosa
     * @param entrada_Mensaje 
     */
    private void imprimirExitoSentenciaMySQL(String entrada_Mensaje){
        JOptionPane.showMessageDialog(null, entrada_Mensaje);
    }
    
    /**
     * Inicia una conexion con la base de datos
     */
    private void iniciarConexionBD(){
        GestorConexionBD conexionBD;
        conexionBD = GestorConexionBD.obtenerPermisosAdministradorConexion();
        administradorSentencias = conexionBD.abrirConexionBD();
    }

    /**
     * termina la conexion con la base de datos
     */
    private void terminarConexionBD(){
        GestorConexionBD conexionBD;
        conexionBD = GestorConexionBD.obtenerPermisosAdministradorConexion();
        conexionBD.cerrarConexionBD();
    }
    
////////////////////////////////////////////////////////////////////////////////
// Declaracion de variables
////////////////////////////////////////////////////////////////////////////////
    private Statement administradorSentencias;
}
